#include<iostream>
#include<cstring>
#include<math.h>
using namespace std;
int N,D;
int root[1005],repaired[1005];
void initSet(){
    for(int i=1;i<=N;i++){
        root[i]=i;
    }
}
int findRoot(int a){
	int b=a;  //把初始值赋给b 
	while(a!=root[a]){
		a=root[a];  //找到a的祖先节点 
	}
	while(b!=a){  //直到b==a为止 
		int temp=root[b]; //设一个中间变量为b的父亲节点 
		root[b]=a; //直接让b的父亲节点为a的祖先节点 
		b=temp;  //b等于b的父亲节点 
	}
	return a;
}
int getDistance(int x1,int y1,int x2,int y2){
    int dx=x1-x2,dy=y1-y2;
    return dx*dx+dy*dy;
}
struct Node{
    int x,y;
};
Node nodes[1005];

int main(){
    memset(root,0,sizeof(root));
    memset(repaired,0,sizeof(repaired));
    cin>>N>>D;
    for(int i=1;i<=N;i++){
        cin>>nodes[i].x>>nodes[i].y;
    }
    char ch;int num,num1,num2;
    initSet();
    while(cin>>ch){
        if(ch=='O'){
            cin>>num;
            //已经输入过了
            if(repaired[num]) continue;
            repaired[num]=1;
                        
            //遍历所有已经修好的电脑，把能连上的放到同一个集合里
            for(int i=1;i<=N;i++){
                if(repaired[i]&&root[i]!=root[num]){
                    if(getDistance(nodes[i].x,nodes[i].y,nodes[num].x,nodes[num].y)<=D*D){
                        int rooti=findRoot(i);
                        root[rooti]=num;
                    }
                }
            }
        }
        if(ch=='S'){
            cin>>num1>>num2;
            int root1=findRoot(num1),root2=findRoot(num2);
            if(root1==root2){
                // cout<<root1<<endl;
                cout<<"SUCCESS"<<endl;
            }else{
                // cout<<root1<<" "<<root2<<endl;
                cout<<"FAIL"<<endl;
            }
        }
    }
    return 0;
}